# @author errorcpp@qq.com
# @brief 文件相关操作
# xcmake_aux_code_for_directory: 收集目录下的全部代码
# xcmake_aux_inc_for_directory:  收集目录下的全部头文件
# xcmake_aux_src_for_directory:  收集目录下的全部源码文件


# 辅助golb的预定义字符串
set(__X_C_AND_CPP_HEAD_GLOB_HELP "*.h" "*.hh" "*.hpp" "*.hxx" "*.hcc")  
set(__X_C_AND_CPP_SRC_GLOB_HELP "*.c" "*.cpp" "*.cc")
set(__X_C_AND_CPP_CODE_GLOB_HELP ${__X_C_AND_CPP_HEAD_GLOB_HELP} ${__X_C_AND_CPP_SRC_GLOB_HELP})

# 辅助搜索的工具函数
function(__xcmake_add_prefix_for_aux_code_list TAR_DIR SRC_STR_LIST RESULT_STR_LIST)
    # SRC_STR_LIST实际传入的是变量名，要两次转换
    SET(__src_str_list ${SRC_STR_LIST})
    foreach(str_item ${__src_str_list})
        string(CONCAT __prefixed_item ${TAR_DIR} ${str_item})
        #message("fff: " ${__prefixed_item})
        list(APPEND __result_list ${__prefixed_item})
    endforeach()
    SET(${RESULT_STR_LIST} ${__result_list} PARENT_SCOPE)  # PARENT_SCOPE这个控制了输出到函数外面去
endfunction()

function(xcmake_aux_code_for_directory OUTPUT_LIST INPUT_DIR RECURSIVE)
    if (NOT INPUT_DIR MATCHES "/$")  # 不是以 / 结尾则添加 /
        __xcmake_add_prefix_for_aux_code_list(${INPUT_DIR}/ "${__X_C_AND_CPP_CODE_GLOB_HELP}" __glob_list)
    else()
        __xcmake_add_prefix_for_aux_code_list(${INPUT_DIR} "${__X_C_AND_CPP_CODE_GLOB_HELP}" __glob_list)
    endif()
    if(RECURSIVE)
        file(GLOB_RECURSE SOURCE_FILES ${__glob_list}) # 获取输入目录及其子目录下的所有源码文件
    else()
        file(GLOB SOURCE_FILES ${__glob_list}) # 仅获取输入目录下的源码文件
    endif()
    # 绝对路径转为相对路径
    SET(__relative_source_files)
    foreach(fname ${SOURCE_FILES})
        #get_filename_component(new_fname ${fname} NAME)
        file(RELATIVE_PATH __relative_fname ${CMAKE_CURRENT_SOURCE_DIR} ${fname})
        #message(${__relative_fname})
        list(APPEND __relative_source_files ${__relative_fname})
    endforeach()
    # 分好改空格
    #string(REPLACE ";" " " __relative_source_files "${__relative_source_files}")  # 作为源码列表可以按照;分隔
    # 上面列表被转为一个长字符串了，需要在转为列表
    #separate_arguments(__relative_source_files)   # 这里会直接按照空格分隔处理了
    set(${OUTPUT_LIST} ${__relative_source_files} PARENT_SCOPE) # 将文件列表存储到输出变量
endfunction()


# 绝对路径转为相对路径
# # 假设你有一个绝对路径
# set(absolute_path "/path/to/your/file")
# # 获取当前 CMake 文件的路径
# get_filename_component(current_cmake_dir "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
# # 将绝对路径转换为相对路径
# file(RELATIVE_PATH relative_path ${current_cmake_dir} ${absolute_path})
# message("相对路径: ${relative_path}")


# 文件一起拷贝
# function(copy_sources INPUT_DIR OUTPUT_DIR RECURSIVE)
#     if(RECURSIVE)
#         file(GLOB_RECURSE SOURCE_FILES "${INPUT_DIR}/*.cpp" "${INPUT_DIR}/*.h") # 获取输入目录及其子目录下的所有源码文件
#     else()
#         file(GLOB SOURCE_FILES "${INPUT_DIR}/*.cpp" "${INPUT_DIR}/*.h") # 仅获取输入目录下的源码文件
#     endif()
#     foreach(source IN LISTS SOURCE_FILES)
#         file(RELATIVE_PATH SRC_REL_PATH "${INPUT_DIR}" "${source}") # 计算源码文件相对于输入目录的相对路径
#         set(DEST "${OUTPUT_DIR}/${SRC_REL_PATH}") # 计算源码文件在输出目录中的路径
#         get_filename_component(DEST_DIR ${DEST} DIRECTORY) # 获取源码文件要复制到的目标目录
#         file(MAKE_DIRECTORY ${DEST_DIR}) # 确保目标目录存在
#         configure_file(${source} ${DEST} COPYONLY) # 复制源码文件到目标目录
#     endforeach()
# endfunction()